MooseX::DeclareX takes the declarative sugar of MooseX::Declare to the next level. Some people already consider MooseX::Declare to be pretty insane. If you're one of those people, then you're not going to like this...

However, build also performs a little housekeeping for you. If an attribute does not exist with the same name as the builder, it will create one for you (which will be read-only, with type constraint "Any" unless build can detect a more specific type constraint from the method's return signature). If the attribute already exists but does not have a builder set, then it will set it.

What is the distinction between keywords and plugins? Keywords are the words that declare class-like things. Plugins are the other bits, and only work inside the class-like declarations.

Things inherited from MooseX::Declare and MooseX::Method::Signatures do not need to be indicated; they are always loaded. Things inherited from TryCatch do not need to be indicated; they are available outside class declarations too.

If you don't specify a list of keywords, then the default list is:

[qw(class role exception)]

If you don't specify a list of plugins, then the default list is:

[qw(build guard std_constants)]

That is, there are certain pieces of functionality which are not available by default - they need to be loaded explicitly!