"Ara.T.Howard" wrote:
>
> what i would like to accomplish would be something like this:
>
>
>   class Abstract
>     class << self
>       def x
>         # defined?(self::X)  ? self::X : nil
>       end
>     end
>   end
>
>   class Concrete < Abstract
>     X = 42
>   end
>
>   # p Base.x    # => nil
>   # p Derived.x # => 42
>
>
> does this make sense?  in essence i want an abstract class method with the
> semantics of "iff a concrete class has defined a certain constant, return it"
>
> the problem is that 'self::X' above tries to reference 'Class::X', if i
> replace 'self' with 'Abstract' then i will be referencing the incorrect 'X'...
>
> how does one say 'the constant of the current class' from within a class
> method?
>

#-----

class A
  class << self
    def x
      const_defined?(:X) ? const_get(:X) : nil
    end
  end
end

class C < A
  X = 42
end

p A.x    # => nil
p C.x    # => 42

#-----


daz