def timeline_entries
      @timeline_entries ||= begin
        result = { }

        self.timelines.each do |(timeline_kind, timeline_class)|
          dir_name = Activr::Utils.kind_for_class(timeline_class)
          dir_path = File.join(Activr.timelines_path, dir_name)

          if !File.directory?(dir_path)
            dir_name = Activr::Utils.kind_for_class(timeline_class, 'timeline')
            dir_path = File.join(Activr.timelines_path, dir_name)
          end

          if File.directory?(dir_path)
            result[timeline_kind] = { }

            Dir["#{dir_path}/*.rb"].sort.inject(result[timeline_kind]) do |memo, file_path|
              base_name = File.basename(file_path, '.rb')

              # skip base class
              if (base_name != "base_timeline_entry")
                klass = "#{timeline_class.name}::#{base_name.camelize}".constantize

                route_kind = if (match_data = base_name.match(/(.+)_timeline_entry$/))
                  match_data[1]
                else
                  base_name
                end

                route = timeline_class.routes.find do |timeline_route|
                  timeline_route.kind == route_kind
                end

                raise "Timeline entry class found for an unspecified timeline route: #{file_path} / routes: #{timeline_class.routes.inspect}" unless route
                memo[route_kind] = klass
              end

              memo
            end
          end
        end

        result
      end
    end
def timeline_entries
      @timeline_entries ||= begin
        result = { }

        self.timelines.each do |(timeline_kind, timeline_class)|
          dir_name = Activr::Utils.kind_for_class(timeline_class)
          dir_path = File.join(Activr.timelines_path, dir_name)

          if !File.directory?(dir_path)
            dir_name = Activr::Utils.kind_for_class(timeline_class, 'timeline')
            dir_path = File.join(Activr.timelines_path, dir_name)
          end

          if File.directory?(dir_path)
            result[timeline_kind] = { }

            Dir["#{dir_path}/*.rb"].sort.inject(result[timeline_kind]) do |memo, file_path|
              base_name = File.basename(file_path, '.rb')

              # skip base class
              if (base_name != "base_timeline_entry")
                klass = "#{timeline_class.name}::#{base_name.camelize}".constantize

                route_kind = if (match_data = base_name.match(/(.+)_timeline_entry$/))
                  match_data[1]
                else
                  base_name
                end

                route = timeline_class.routes.find do |timeline_route|
                  timeline_route.kind == route_kind
                end

                raise "Timeline entry class found for an unspecified timeline route: #{file_path} / routes: #{timeline_class.routes.inspect}" unless route
                memo[route_kind] = klass
              end

              memo
            end
          end
        end

        result
      end
    end
Get all registered timeline entries

 @return [Hash{String=>Hash{String=>Class}}] A hash of `<timeline kind> => { <route kind> => <timeline entry class>, ... }`