This repository is private.
All pages are served over SSL and all pushing and pulling is done over SSH.
No one may fork, clone, or view it unless they are added as a member.
Every repository with this icon (
) is private.
Every repository with this icon (
This repository is public.
Anyone may fork, clone, or view it.
Every repository with this icon (
) is public.
Every repository with this icon (
| f28bd955 » | jeremy | 2009-04-22 | 1 | require 'active_support/core_ext/object/metaclass' | |
| 5dd29c46 » | jeremy | 2009-05-13 | 2 | require 'active_support/core_ext/module/aliasing' | |
| f28bd955 » | jeremy | 2009-04-22 | 3 | ||
| 8a9934a9 » | josh | 2008-07-14 | 4 | module ActiveSupport | |
| 8a87d8a6 » | josh | 2008-07-22 | 5 | module Memoizable | |
| 761a633a » | josh | 2008-12-03 | 6 | def self.memoized_ivar_for(symbol) | |
| 8603813a » | libc | 2008-10-05 | 7 | "@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym | |
| 8 | end | ||||
| 9 | |||||
| 761a633a » | josh | 2008-12-03 | 10 | module InstanceMethods | |
| 8a87d8a6 » | josh | 2008-07-22 | 11 | def self.included(base) | |
| 12 | base.class_eval do | ||||
| 13 | unless base.method_defined?(:freeze_without_memoizable) | ||||
| 14 | alias_method_chain :freeze, :memoizable | ||||
| 15 | end | ||||
| 16 | end | ||||
| 17 | end | ||||
| 18 | |||||
| 19 | def freeze_with_memoizable | ||||
| 3fc9a67c » | jeremy | 2008-08-13 | 20 | memoize_all unless frozen? | |
| 21 | freeze_without_memoizable | ||||
| 22 | end | ||||
| 23 | |||||
| 24 | def memoize_all | ||||
| 761a633a » | josh | 2008-12-03 | 25 | prime_cache ".*" | |
| 26 | end | ||||
| 27 | |||||
| 28 | def unmemoize_all | ||||
| 29 | flush_cache ".*" | ||||
| 30 | end | ||||
| 31 | |||||
| 32 | def prime_cache(*syms) | ||||
| 33 | syms.each do |sym| | ||||
| 34 | methods.each do |m| | ||||
| 35 | if m.to_s =~ /^_unmemoized_(#{sym})/ | ||||
| 36 | if method(m).arity == 0 | ||||
| 37 | __send__($1) | ||||
| 38 | else | ||||
| 39 | ivar = ActiveSupport::Memoizable.memoized_ivar_for($1) | ||||
| 40 | instance_variable_set(ivar, {}) | ||||
| 41 | end | ||||
| a8057669 » | jeremy | 2008-08-07 | 42 | end | |
| 43 | end | ||||
| 44 | end | ||||
| 3fc9a67c » | jeremy | 2008-08-13 | 45 | end | |
| ae6105ef » | jeremy | 2008-07-27 | 46 | ||
| d48ebead » | jpignata | 2009-09-04 | 47 | def flush_cache(*syms) | |
| 761a633a » | josh | 2008-12-03 | 48 | syms.each do |sym| | |
| e4ceea37 » | jeem | 2009-08-09 | 49 | (methods + private_methods + protected_methods).each do |m| | |
| d48ebead » | jpignata | 2009-09-04 | 50 | if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/ | |
| 761a633a » | josh | 2008-12-03 | 51 | ivar = ActiveSupport::Memoizable.memoized_ivar_for($1) | |
| 52 | instance_variable_get(ivar).clear if instance_variable_defined?(ivar) | ||||
| 53 | end | ||||
| 3fc9a67c » | jeremy | 2008-08-13 | 54 | end | |
| 55 | end | ||||
| 8a87d8a6 » | josh | 2008-07-22 | 56 | end | |
| 57 | end | ||||
| 58 | |||||
| ef6f6625 » | josh | 2008-07-18 | 59 | def memoize(*symbols) | |
| 60 | symbols.each do |symbol| | ||||
| 3fc9a67c » | jeremy | 2008-08-13 | 61 | original_method = :"_unmemoized_#{symbol}" | |
| 761a633a » | josh | 2008-12-03 | 62 | memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol) | |
| ef6f6625 » | josh | 2008-07-18 | 63 | ||
| eb9af20b » | wycats | 2009-01-22 | 64 | class_eval <<-EOS, __FILE__, __LINE__ + 1 | |
| a2270ef2 » | fxn | 2008-12-28 | 65 | include InstanceMethods # include InstanceMethods | |
| 66 | # | ||||
| 67 | if method_defined?(:#{original_method}) # if method_defined?(:_unmemoized_mime_type) | ||||
| 68 | raise "Already memoized #{symbol}" # raise "Already memoized mime_type" | ||||
| 69 | end # end | ||||
| 70 | alias #{original_method} #{symbol} # alias _unmemoized_mime_type mime_type | ||||
| 71 | # | ||||
| 72 | if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0 | ||||
| 73 | def #{symbol}(reload = false) # def mime_type(reload = false) | ||||
| 74 | if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty? | ||||
| 1aadafda » | wycats | 2009-04-08 | 75 | #{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type] | |
| a2270ef2 » | fxn | 2008-12-28 | 76 | end # end | |
| 77 | #{memoized_ivar}[0] # @_memoized_mime_type[0] | ||||
| 78 | end # end | ||||
| 79 | else # else | ||||
| 80 | def #{symbol}(*args) # def mime_type(*args) | ||||
| 81 | #{memoized_ivar} ||= {} unless frozen? # @_memoized_mime_type ||= {} unless frozen? | ||||
| 82 | reload = args.pop if args.last == true || args.last == :reload # reload = args.pop if args.last == true || args.last == :reload | ||||
| 83 | # | ||||
| 84 | if defined?(#{memoized_ivar}) && #{memoized_ivar} # if defined?(@_memoized_mime_type) && @_memoized_mime_type | ||||
| 85 | if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args) | ||||
| 86 | #{memoized_ivar}[args] # @_memoized_mime_type[args] | ||||
| 87 | elsif #{memoized_ivar} # elsif @_memoized_mime_type | ||||
| 1aadafda » | wycats | 2009-04-08 | 88 | #{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args) | |
| a2270ef2 » | fxn | 2008-12-28 | 89 | end # end | |
| 90 | else # else | ||||
| 91 | #{original_method}(*args) # _unmemoized_mime_type(*args) | ||||
| 92 | end # end | ||||
| 93 | end # end | ||||
| 94 | end # end | ||||
| c67d25e3 » | Nielsomat | 2009-03-06 | 95 | # | |
| 96 | if private_method_defined?(#{original_method.inspect}) # if private_method_defined?(:_unmemoized_mime_type) | ||||
| 97 | private #{symbol.inspect} # private :mime_type | ||||
| 98 | end # end | ||||
| ef6f6625 » | josh | 2008-07-18 | 99 | EOS | |
| 8a9934a9 » | josh | 2008-07-14 | 100 | end | |
| 101 | end | ||||
| 102 | end | ||||
| 103 | end | ||||








