The default object constructor returned by new_class()
has been updated.
It now accepts lazy (promise) property defaults and includes dynamic properties
with a setter
in the constructor. Additionally, all custom property setters
are now consistently invoked by the default constructor. If you're using S7 in
an R package, you'll need to re-document to ensure that your documentation
matches the updated usage (#438, #445).
The call context of a dispatched method (as visible in sys.calls()
and
traceback()
) no longer includes the inlined method and generic, resulting in
more compact and readable tracebacks. The dispatched method call now contains
only the method name, which serves as a hint for retrieving the method. For
example: method(my_generic, class_double)
(x=10, ...). (#486)
New nameOfClass()
method exported for S7 base classes, to enable usage like
inherits("foo", S7::class_character)
(#432, #458)
Added support for more base/S3 classes (#434): class_POSIXlt
,
class_POSIXt
, class_formula
, class_call
, class_language
,
and class_name
.
S7 provides a new automatic backward compatibility mechanism to provide
a version of @
that works in R before version 4.3 (#326).
new_class()
now automatically infers the package name when called from
within an R package (#459).
Improved error message when custom validators return invalid values (#454, #457).
Fixed S3 methods registration across packages (#422).
convert()
now provides a default method to transform a parent class instance
into a subclass, enabling class construction from a prototype (#444).
A custom property getter()
no longer infinitely recurses when accessing
itself (reported in #403, fixed in #406).
method()
generates an informative message with class
S7_error_method_not_found
when dispatch fails (#387).
method<-()
can create multimethods that dispatch on NULL
.
In new_class()
, properties can either be named by naming the element
of the list or by supplying the name
argument to new_property()
(#371).
The Ops
generic now falls back to base Ops behaviour when one of the
arguments is not an S7 object (#320). This means that you get the somewhat
inconsistent base behaviour, but means that S7 doesn't introduce a new axis
of inconsistency.
prop()
(#395) and prop<-
/@<-
(#396) have been optimized and
rewritten in C.
super()
now works with Ops methods (#357).
validate()
is now always called after a custom property setter was invoked
(reported in #393, fixed in #396).
Classes get a more informative print method (#346).
Correctly register S3 methods for S7 objects with a package (#333).
External methods are now registered using an attribute of the S3 methods
table rather than an element of that environment. This prevents a warning
being generated during the "code/documentation mismatches" check in
R CMD check
(#342).
class_missing
and class_any
can now be unioned with |
(#337).
new_object()
no longer accepts NULL
as .parent
.
new_object()
now correctly runs the validator from abstract parent classes
(#329).
new_object()
works better when custom property setters modify other
properties.
new_property()
gains a validator
argument that allows you to specify
a per-property validator (#275).
new_property()
clarifies that it's the user's responsibility to return
the correct class; it is not automatically validated.
Properties with a custom setter are now validated after the setter has
run and are validated when the object is constructed or when you call
validate()
, not just when you modify them after construction.
S7_inherits()
now accepts class = NULL
to test if an object is any
sort of S7 object (#347).
new_external_generic()
is only needed when you want a soft dependency
on another package.
methods_register()
now also registers S3 and S4 methods (#306).
Subclasses of abstract class can have readonly properties (#269).
During construction, validation is now only performed once for each element of the class hierarchy (#248).
Implemented a better filtering strategy for the S4 class hierarchy so you can now correctly dispatch on virtual classes (#252).
New set_props()
to make a modified copy of an object (#229).
R CMD check
now passes on R 3.5 and greater (for tidyverse
compatibility).
Dispatching on an evaluated argument no longer causes a crash (#254).
Improve method dispatch failure message (#231).
Can use |
to create unions from S7 classes (#224).
Can no longer subclass an environment via class_environment
because we
need to think the consequences of this behaviour through more fully (#253).
Add [.S7_object
, [<-.S7_object
, [[.S7_object
, and [[<-.S7_object
methods to avoid "object of type 'S4' is not subsettable" error
(@jamieRowen, #236).
Combining S7 classes with c()
now gives an error (#230)
Base classes now show as class_x
instead of "x"
in method print (#232)
Exported class_factor
, class_Date
, class_POSIXct
, and
class_data.frame
.
New S7_inherits()
and check_is_S7()
(#193)
new_class()
can create abstract classes (#199).
method_call()
is now S7_dispatch()
(#200).
Can now register methods for double-dispatch base Ops (currently only works if both classes are S7, or the first argument is S7 and the second doesn't have a method for the Ops generic) (#128).
All built-in wrappers around base types use class_
. You can no longer
refer to a base type with a string or a constructor function (#170).
convert()
allows you to convert an object into another class (#136).
super()
replaces next_method()
(#110).
class_any
and class_missing
make it possible to dispatch on absent
arguments and arguments of any class (#67).
New method_explain()
to explain dispatch (#194).
Minor property improvements: use same syntax for naming short-hand and full property specifications; input type automatically validated for custom setters. A property with a getter but no setter is read-only (#168).
When creating an object, unspecified properties are initialized with their
default value (#67). DISCUSS: to achieve this, the constructor arguments
default to class_missing
.
Add $.S7_object
and $<-.S7_object
methods to avoid "object of type 'S4'
is not subsettable" error (#204).
Dispatch now disambiguates between S4 and S3/S7, and, optionally, between S7 classes in different packages (#48, #163).
new_generic()
now requires dispatch_args
(#180). This means that
new_generic()
will typically be called without names. Either
new_generic("foo", "x")
for a "standard" generic, or
new_generic("foo", "x", function(x, y) call_method())
for
a non-standard method.
new_external_generic()
now requires dispatch_args
so we can eagerly
check the signature.
Revamp website. README now shows brief example and more info in
vignette("S7")
. Initial design docs and minutes are now articles so
they appear on the website.
props<-
for setting multiple properties simultaneously and validating
afterwards (#149).new_S3_class()
for
referring to S3 classes (#134). S4 unions are converted to S7 unions (#150).[email protected]
-> S7_data()
; probably to be replaced by casting.signature
-> dispatch_args
.str()
and print()
methodsnew_class()
has properties as 3rd argument (instead of constructor).