main_time=Time.now

$:<<File.dirname(__FILE__) unless $:.include?(File.dirname(__FILE__))

require 'abstract' #FIXME remove from gem
require 'active_support/core_ext/numeric/time'
require 'active_support/concern'
require 'active_support/callbacks'
require 'active_support/dependencies'
require 'lolita/errors'
# Require all ruby extensions
Dir["#{File.dirname(__FILE__)}/lolita/ruby_ext/**/*.*"].each do |path|
  require path
end

module Lolita
  autoload(:LazyLoader,'lolita/lazy_loader')
  autoload(:VERSION,'lolita/version')
  autoload(:ObservedArray,'lolita/observed_array')
  autoload(:Builder,'lolita/builder')
  autoload(:BaseConfiguration,'lolita/base_configuration')
  module Adapter
    autoload :AbstractAdapter, 'lolita/adapter/abstract_adapter'
    autoload :ActiveRecord, 'lolita/adapter/active_record'
    autoload :Mongoid, 'lolita/adapter/mongoid'
  end

  module DBI
    autoload :Base, 'lolita/dbi/base'
  end
  
  module Hooks
    require 'lolita/hooks/hooks'
    include Lolita::Hooks::Hooks
    autoload :Base, 'lolita/hooks/base'
    autoload :Component, 'lolita/hooks/component'
  end

  module Configuration
    autoload :Factory, 'lolita/configuration/factory'
    autoload :Base, 'lolita/configuration/base'
    autoload :Column, 'lolita/configuration/column'
    autoload :Columns, 'lolita/configuration/columns'
    autoload :Field, 'lolita/configuration/field'
    autoload :FieldSet, 'lolita/configuration/field_set'
    autoload :List, 'lolita/configuration/list'
    autoload :Page, 'lolita/configuration/page'
    autoload :Tab, 'lolita/configuration/tab'
    autoload :Tabs, 'lolita/configuration/tabs'

    ["tab","field"].each do |type|
      Dir["#{File.dirname(__FILE__)}/lolita/configuration/#{type}/**/*.*"].each do |path|
        base_name=File.basename(path,".rb")
        autoload :"#{base_name.capitalize}#{type.humanize}", "lolita/configuration/#{type}/#{base_name}"
      end
    end

    
    def self.included(base)
      base.class_eval do
        extend ClassMethods
        def lolita
          self.class.lolita
        end
      end
    end

    module ClassMethods
      def lolita(&block)
        Lolita::LazyLoader.lazy_load(self,:@lolita,Lolita::Configuration::Base,self,&block)
      end
      def lolita=(value)
        if value.is_a?(Lolita::Configuration::Base)
          @lolita=value
        else
          raise ArgumentError.new("Only Lolita::Configuration::Base is acceptable.")
        end
      end
    end
  end

  module Test
    autoload :Matchers, 'lolita/test/matchers'
  end
  
  module Controllers
    autoload :InternalHelpers, 'lolita/controllers/internal_helpers'
    autoload :UserHelpers, 'lolita/controllers/user_helpers'
    autoload :UrlHelpers, 'lolita/controllers/url_helpers'
    autoload :ComponentHelpers, 'lolita/controllers/component_helpers'
    autoload :ViewUserHelpers, 'lolita/controllers/view_user_helpers'
  end


  @@scopes={}

  def self.scope name=nil
    name||=scope_name
    @@scopes[name]||=Lolita::BaseConfiguration.new(name)
    @@scopes[name]
  end

  def self.setup
    yield scope
  end

  def self.scope_name
    :default
  end
  
  def self.root
    @@root||=File.expand_path("#{__FILE__}/../..")
  end

  def self.app_root
    @@app_root||=File.join(File.expand_path("#{__FILE__}/../.."),"app")
  end
  
  def self.method_missing method_name, *args, &block
    scope.send(method_name,*args,&block)
  end

  module Generators
    autoload :FileHelper, File.join(Lolita.root,"lib","generators","helpers","file_helper")
  end
  
end

engine_time=Time.now

if defined?(Rails)
  require 'lolita/rails/all'
end

puts "Lolita engine started in #{Time.at(Time.now-engine_time).strftime("%M:%S.%3N")}"

puts "Lolita started in #{Time.at(Time.now-main_time).strftime("%M:%S.%3N")}"