Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision 336d0b358f47a852a1638773577aca306f416c9e)
+++ src/AST/Node.hpp	(revision fdbd4fd48f5ede095445ae2cfd7ea0d99bd76af0)
@@ -133,4 +133,7 @@
 	operator const node_t * const() const { return node; }
 
+	template<typename o_node_t>
+	const o_node_t * as() const { return dynamic_cast<o_node_t *>(node); }
+
 	using ptr = const node_t *;
 
Index: src/AST/porting.md
===================================================================
--- src/AST/porting.md	(revision 336d0b358f47a852a1638773577aca306f416c9e)
+++ src/AST/porting.md	(revision fdbd4fd48f5ede095445ae2cfd7ea0d99bd76af0)
@@ -3,6 +3,8 @@
 ## Pointer Types ##
 * raw pointer `T*` is used for construction, but not storage
-* strong pointer `ast::ptr<T>` is used for an ownership relationship
-* weak pointer `ast::readonly<T>` is used for an observation relationship
+* `ast::ptr_base<T,R>` is a pointer to AST node `T` with reference type `R`
+  * specialization: strong pointer `ast::ptr<T>` is used for an ownership relationship
+  * specialization: weak pointer `ast::readonly<T>` is used for an observation relationship
+  * added `ast::ptr_base<T,R>::as<S>()` with same semantics as `dynamic_cast<S*>(p)`
 
 ## Visitors ##
@@ -56,4 +58,5 @@
 * Strong justification required for private fields
   * No `get_` prefix on getters (including for generated fields)
+    * exception is `DeclWithType::get_type()`
 * Notable changes:
   * for concision and consistency with subclasses:
@@ -108,2 +111,21 @@
 * Still a `std::list` for children, rather than `std::vector`
   * allows more-efficient splicing for purposes of later code generation
+
+`Type`
+* `forall` field split off into `ParameterizedType` subclass
+  * any type that needs it can inherit from `ParameterizedType`
+* `get_qualifiers()` replaced with accessor `qualifiers()` and mutator `set_qualifiers()`
+  * `get_CV()` replaced with `is_CV()` variants
+* A number of features only supported on aggregates pushed down to `ReferenceToType`:
+  * `attributes`: per docs [1] GCC only supports type attributes on aggregates and typedefs
+    * suggest adding a `TypeWithAttributes` wrapper type if this proves insufficient
+  * `getAggr()`
+  * `genericSubstitution()`
+
+`BasicType`
+* does not inherit from `Type` to allow pointer inlining
+* moved `Kind` before qualifiers in constructor to allow for default
+* **TODO** move `kind`, `typeNames` into code generator
+
+[1] https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Type-Attributes.html#Type-Attributes
+
