public function terms( $args = array(), $merge = true, $term_class = '' ) {
		// Ensure backwards compatibility.
		if ( ! is_array( $args ) || isset( $args[0] ) ) {
			$args = array(
				'query' => array(
					'taxonomy' => $args,
				),
				'merge' => $merge,
				'term_class' => $term_class,
			);

			if ( empty( $args['term_class']) ) {
				$args['term_class'] = $this->TermClass;
			}
		}

		// Defaults.
		$args = wp_parse_args( $args, array(
			'query' => array(
				'taxonomy' => 'all',
			),
			'merge' => true,
			'term_class' => $this->TermClass,
		) );

		$tax        = $args['query']['taxonomy'];
		$merge      = $args['merge'];
		$term_class = $args['term_class'];

		$taxonomies = array();

		// @todo: Remove in 2.x
		if ( is_string($merge) && class_exists($merge) ) {
			$term_class = $merge;
		}

		// Build an array of taxonomies.
		if ( is_array( $tax ) ) {
			$taxonomies = $tax;
		} elseif ( is_string( $tax ) ) {
			if ( in_array( $tax, array( 'all', 'any', '' ) ) ) {
				$taxonomies = get_object_taxonomies($this->post_type);
			} else {
				$taxonomies = array($tax);
			}
		}

		// @todo Remove in 2.x
		$taxonomies = array_map( function( $taxonomy ) {
			if ( in_array( $taxonomy, array( 'tag', 'tags' ), true ) ) {
				$taxonomy = 'post_tag';
			} elseif ( 'categories' === $taxonomy ) {
				$taxonomy = 'category';
			}

			return $taxonomy;
		}, $taxonomies );

		$terms = wp_get_post_terms( $this->ID, $taxonomies, $args['query'] );

		if ( is_wp_error( $terms ) ) {
			/**
			 * @var $terms \WP_Error
			 */
			Helper::error_log( "Error retrieving terms for taxonomies on a post in timber-post.php" );
			Helper::error_log( 'tax = ' . print_r( $tax, true ) );
			Helper::error_log( 'WP_Error: ' . $terms->get_error_message() );

			return $terms;
		}

		// Map over array of WordPress terms and transform them into instances of the chosen term class.
		$terms = array_map( function( $term ) use ( $term_class ) {
			return call_user_func( array( $term_class, 'from' ), $term->term_id, $term->taxonomy );
		}, $terms );

		if ( ! $merge ) {
			$terms_sorted = array();

			// Initialize sub-arrays.
			foreach ( $taxonomies as $taxonomy ) {
				$terms_sorted[ $taxonomy ] = array();
			}

			// Fill terms into arrays.
			foreach ( $terms as $term ) {
				$terms_sorted[ $term->taxonomy ][] = $term;
			}

			return $terms_sorted;
		}

		return $terms;
	}