Moose attribute didn't allow the reference rather than a CODE reference as a default value. That prevents the objects shared a attribute when initializing. Actually this is a good design. But How should I do when needing a shared attribute between objects? I may refer this as the concept of class variable.
The state variable in CODE reference may be competent with this role.
A Counter as an example here. We define a Counter class here.
A counter has a attribute "value" and a method "inc" to increment it.
Then We define a Person class.
The Person class has a attribute "name" and a shared attribute "count". The Counter is a state variable return from a anonymous CODE reference. That's the trick.
The BUILD hook increment the counter everytime a new Person is constructed.
Then we examinate the shared variable.
A global variable in package name may still work. But this way uses 'has' syntax sugar. :p
If you use builder to replace the default option. the subroutine used by the builder is just the class variable accessor from Class name, returning value as $person->count().