These changes seem weird.. Why are _fullpath/filename/extension class level attributes? Why is the `extra` dictionary instantiated in the arguments (which makes it shared between all instances)? Using the `locals()` thing for the fullpath property seems overly clever